package wt.rocket.ctrl.persona;

import java.util.Date;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.*;
import wt.rocket.ctrl.*;
import wt.rocket.model.beans.Persona;
import wt.rocket.model.servicios.ServicioPersona;

/**
 * controlador asociado a Lider.zul
 *
 * @author Waytech
 */
public class CtrlPersona extends GenericForwardComposer {

  //referencias:
  Include vistaBarraMenu;
  Include panelCentral;
  //mensajes:
  Div divMensaje;
  Label etqMensaje;
  //widgets:
  Label tituloVentana;
  //botones
  //tabbox:
  Tabbox tabbox;
  Tab tabDB;
  Tab tabDir;
  Tab tabOtros;
  Tab tabObs;
  A btnIngresarReporte;
  //pestaña "Datos Básicos"
  Textbox db$txtCedula;
  Textbox db$txtNombre;
  Textbox db$txtTelefono;
  Textbox db$txtEmail;
  Label db$etqCedula;
  Label db$etqNombre;
  Label db$etqTelefono;
  Label db$etqEmail;
  Label db$etqFechaNac;
  //pestaña "Observaciones"
  Label obs$etqObservaciones;
  Textbox obs$txtObservaciones;
  //variables de control:
  int tabSeleccionado;
  String modo;  //modo={new,edicion,ver,imprimir,...}
  String titulo = "Persona";
  CtrlVista ctrlVista = new CtrlVista();
  private String descripcionTitulo;
  String fechaApertura = "";
  Date dateFechaApertura;
  //gestión de datos
  String cedula = "";
  String nombre = "";
  //fecha de apertura con formato para BD
  String fechaAperturaBD;
  private String anfitrion;
  //base de datos
  Persona persona = new Persona();
  ServicioPersona servicioPersona = new ServicioPersona();
  private int idPersona;

  @Override
  public void doAfterCompose(Component comp) throws Exception {
    super.doAfterCompose(comp);
    inicio();
  }

  public void inicio() throws InterruptedException {
    modo = Sesion.getModo();
    if (modo == null) {
      modo = Modos.VER;
    }
    if (modo.equals(Modos.VER)) {
      getID();
      buscarData();
      mostrarData();
      selectTab(1);
    }
    actualizarEstado();
    //OJO
    notificarBarra();
  }

  //OJO
  /**
   * notifica a barraMenu sobre la vista actual, para el manejo de estados
   */
  private void notificarBarra() {
    vistaBarraMenu = Sesion.getvistaBarraMenu();
    Sesion.setVistaActual(Vistas.PERSONA);
    Sesion.setModo(modo);
    Toolbarbutton btnControl2 = (Toolbarbutton) vistaBarraMenu.getFellow("btnControl2");
    Events.postEvent(1, "onClick", btnControl2, null);
  }

  /**
   * recupera variable de sesión 'idLider' que fue seteada por la vista llamante
   * sólo en modo ver
   */
  private void getID() {
    //simulación
    idPersona = 1;
    /*
     * traer id del elemento try { idLider = (Integer)
     * Sesion.getVariable("idLider"); } catch (Exception e) {
     * System.out.println("CtrlPersona -> ERROR: parámetro idLider nulo... " +
     * e); idLider = 0; }
     */
  }

  /**
   * obtiene la persona de la base de datos con el id respectivo
   */
  void buscarData() {
    persona = servicioPersona.getPersona(idPersona);
    if (persona == null) {
      System.out.println("CtrlLider.buscarLiderBD: NULL");
    } else {
      System.out.println("CtrlLider.Lider=" + persona.toString());
    }
  }

  /**
   * muestra los datos en los widgets
   */
  public void mostrarData() throws InterruptedException {
    if (persona == null) {
      Messagebox.show("Error buscando datos");
      return;
    }
    //llenar widgets con la data
    //datos básicos
    nombre = persona.getNombre();
    if (nombre.isEmpty()) {
      //si no hay valor, mostrar una etiqueta para permitir edición
      nombre = Constantes.VALOR_EDITAR;
    }
    db$etqNombre.setValue(nombre);

    String telefono = persona.getTelefono();
    if (telefono.isEmpty()) {
      //si no hay valor, mostrar una etiqueta para permitir edición
      telefono = Constantes.VALOR_EDITAR;
    }
    db$etqTelefono.setValue(telefono);

    String email = persona.getEmail();
    if (email.isEmpty()) {
      //si no hay valor, se muestra una etiqueta para permitir edición
      email = Constantes.VALOR_EDITAR;
    }
    db$etqEmail.setValue(email);

    descripcionTitulo = nombre;

  }

  /**
   * actualiza el estado de los widgets, título de ventana y setea el foco
   */
  private void actualizarEstado() {
    if (modo.equals(Modos.NEW)) {
      tituloVentana.setValue("Ingresar " + titulo);
      mostrarWidgetsNew(true);
      mostrarWidgetsEdit(false);
      selectTab(1);
      db$txtCedula.setFocus(true);
    } else if (modo.equals(Modos.VER)) {
      tituloVentana.setValue(titulo + ": " + descripcionTitulo);
      mostrarWidgetsNew(false);
      mostrarWidgetsEdit(true);
      setFocoEdicion();
    } else if (modo.equals(Modos.EDITAR)) {
      tituloVentana.setValue(titulo + ": " + descripcionTitulo + " » Editando");
      //TODO: activar la edición de todos los campos a la vez
      getValoresEdit();
      mostrarWidgetsEdit(true);
      setFocoEdicion();
    }
  }

  //OJO
  //llamado desde CtrlMenu
  public void onClick$btnNew() {
    modo = Modos.NEW;
    Sesion.setModo(modo);
    Sesion.setVariable("idLider", 0);
    mensaje("Ingresa la cédula:");
    actualizarEstado();
  }

  //OJO
  /**
   * llamado desde CtrlMenu
   */
  public void onClick$btnEdit() {
    modo = Modos.EDITAR;
    Sesion.setModo(modo);
    actualizarEstado();
    activarEdicionGlobal();
  }

  //OJO
  /**
   * Guarda ante cualquiera de los 2 casos: ingresar nuevo o actualización. la
   * variable de resultado que será usada por CtrlMenu para los mensajes y
   * cambiar modo de edicion dinámica. llamado desde CtrlMenu
   */
  public void onClick$btnSave() {
    modo = Sesion.getModo();
    //* Messagebox.show("CtrlPersona.bntSave. modo=" + modo);
    if (modo.equals(Modos.NEW)) {
      if (ingresarNuevaPersona()) {
        Sesion.setModo(modo = Modos.VER);
        mostrarValoresViewRecienCreada();
        actualizarEstado();
        Sesion.setVariable("resultOperacion", 0);//éxito
      } else {
        Sesion.setVariable("resultOperacion", 1);//error
        //Mostrar mensaje de error en la vista
      }
    } else if (modo.equals(Modos.EDITAR)) {
      if (actualizarPersona()) {
        Sesion.setModo(modo = Modos.VER);
        actualizarEstado();
        Sesion.setVariable("resultOperacion", 0);//éxito
      } else {
        Sesion.setVariable("resultOperacion", 1);//error
      }
    }
  }

  //OJO
  /**
   * llamado desde CtrlMenu
   */
  public void onClick$btnDelete() {
    modo = Modos.OPERACION;
    actualizarEstado();
    //aquí va la operación de borrado
    //borrar el registro
    //cambiarVista a listado de células, o mostrar botón para volver a la lista
    modo = Modos.VER;
  }

  /**
   * no usado
   */
  public void onClick$btnImprimir() {
    //procesamiento de impresión
  }

  public void onSelect$tabbox() {
    tabSeleccionado = tabbox.getSelectedIndex();
    /*
     * -
     * if (modo.equals("editar")) { setFocoEdicion(); }
     *
     */
  }

  /**
   * seleccionar tab de la posición i
   *
   * @param i la posición del tab, comenzando con 1 1: datos básicos 2:
   * dirección 3: otros datos 4: observaciones
   */
  private void selectTab(int i) {
    tabbox.setSelectedIndex(i - 1);
    tabSeleccionado = i;
  }

  /**
   * le da el foco al primer elemento de entrada del tab actual
   *
   */
  public void setFocoEdicion() {
    if (tabSeleccionado == 1) {
      db$txtCedula.setFocus(true);
    }
  }

  /**
   * muestra/oculta las etiquetas que permiten la edición
   */
  private void mostrarWidgetsEdit(boolean status) {
    //datos básicos:
    db$etqCedula.setVisible(status);
    db$etqNombre.setVisible(status);
    db$etqTelefono.setVisible(status);
    db$etqEmail.setVisible(status);
  }

  /**
   * muestra los valores actuales en los widgets de entrada (captura de datos)
   */
  private void getValoresEdit() {
    //-db$etqRed.setValue(persona.getNombreRed());
  }

  /**
   * muestra etiquetas para los valores no seteados en los widgets de
   * visualización luego de grabar o actualizar el registro
   */
  private void mostrarValoresViewRecienCreada() {
    //datos básicos
    db$etqCedula.setValue(cedula);
    db$etqNombre.setValue(Constantes.VALOR_EDITAR);
    db$etqTelefono.setValue(Constantes.VALOR_EDITAR);
    db$etqEmail.setValue(Constantes.VALOR_EDITAR);
  }

  /**
   * Simula el llamado al servicio para registrar una nueva persona en la bd
   * ingresen todos los valores obligatorios
   *
   * @return
   */
  boolean ingresarNuevaPersona() {
    ocultarMensaje();
    //TODO: validar campos
    //ingresar nueva persona
    if (crearPersona()) {
      mensaje("Agrega el resto de la información");
      descripcionTitulo = nombre;
      return true;
    }
    //error:
    mensaje("Error ingresando la persona. Vuelve a intentar");
    return true;
  }

  /**
   * Simula la actualización en la bd del registro completo
   */
  boolean actualizarPersona() {
    return true;
  }

  /**
   * se encarga de crea un célula nueva, con el código y el id de red
   */
  private boolean crearPersona() {
    cedula = db$txtCedula.getValue();
    nombre = db$txtNombre.getValue();
    //idPersona = servicioPersona.ingresarLider(cedula, nombre, idRed);
    idPersona = 3;
    return (idPersona != 0) ? true : false;
  }

  /**
   * MUESTRA los widgets de los campos obligatorios para el registro
   */
  private void mostrarWidgetsNew(boolean visible) {
    db$txtCedula.setVisible(visible);
    db$txtNombre.setVisible(visible);
  }

  /**
   * muestra un mensaje al usuario
   *
   * @param msj
   */
  private void mensaje(String msj) {
    etqMensaje.setValue(msj);
    etqMensaje.setVisible(true);
    divMensaje.setVisible(true);
    System.out.println(this.getClass().toString() + msj);
  }

  /**
   * limpia el mensaje del usuario
   */
  private void ocultarMensaje() {
    etqMensaje.setVisible(false);
    etqMensaje.setValue("");
  }

  /**
   * muestra los valores actuales en los widgets de entrada y quita los widgets
   * de visualización
   */
  private void activarEdicionGlobal() {
    //pongo los valores actuales a los input
    db$txtCedula.setValue(db$etqCedula.getValue());
    db$txtNombre.setValue(db$etqNombre.getValue());
    db$txtTelefono.setValue(db$etqTelefono.getValue());
    db$txtEmail.setValue(db$etqEmail.getValue());
    //oculto los labels
    db$etqCedula.setVisible(false);
    db$etqTelefono.setVisible(false);
    db$etqEmail.setVisible(false);
    db$etqTelefono.setVisible(false);
    //muestro los widgets de entrada
    db$txtCedula.setVisible(true);
    db$txtTelefono.setVisible(true);
    db$txtEmail.setVisible(true);
    db$txtTelefono.setVisible(true);
  }

  /**
   * muestra los valores actuales en los widgets de entrada y quita los widgets
   * de visualización
   */
  private void desActivarEdicionGlobal() {
    db$etqCedula.setValue(db$etqCedula.getValue());
    db$etqNombre.setValue(db$etqNombre.getValue());
    db$etqTelefono.setValue(db$etqTelefono.getValue());
    db$etqEmail.setValue(db$etqEmail.getValue());
    db$etqCedula.setVisible(false);
    db$etqTelefono.setVisible(false);
    db$etqEmail.setVisible(false);
    db$etqTelefono.setVisible(false);
    db$txtCedula.setVisible(true);
    db$txtTelefono.setVisible(true);
    db$txtEmail.setVisible(true);
    db$txtTelefono.setVisible(true);
  }
}
